<?php

namespace app\common\lib;

use think\facade\Log;

class Util
{

    /**
     * @param $url
     * @param array $body
     * @param array $header
     * @param string $type
     * @param int $returnHeader 响应头
     * @return bool|mixed|string
     */
    public static function postCurl($url, $body ="", $header = [], $type = "GET", $returnHeader = true)
    {
        //1.创建一个curl资源
        $ch = curl_init();
        //2.设置URL和相应的选项
        curl_setopt($ch, CURLOPT_URL, $url);//设置url
        //1)设置请求头
        //array_push($header, 'Accept:application/json');
        //array_push($header,'Content-Type:application/json');
        //array_push($header, 'http:multipart/form-data');
        //设置为false,只会获得响应的正文(true的话会连响应头一并获取到) ,获取响应头
        if ($returnHeader) {
            curl_setopt($ch, CURLOPT_HEADER, true);
        }
        curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时限制防止死循环
        //设置发起连接前的等待时间，如果设置为0，则无限等待。
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        //将curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        //2)设备请求体
        if ($body) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);//全部数据使用HTTP协议中的"POST"操作来发送。
        }
        //设置请求头
        if (count($header) > 0) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        //上传文件相关设置
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 对认证证书来源的检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);// 从证书中检查SSL加密算

        //3)设置提交方式
        switch ($type) {
            case "GET":
                curl_setopt($ch, CURLOPT_HTTPGET, true);
                break;
            case "POST":
                curl_setopt($ch, CURLOPT_POST, true);
                break;
            case "PUT"://使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTT
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
                break;
            case "DELETE":
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
                break;
        }
        //4)在HTTP请求中包含一个"User-Agent: "头的字符串。-----必设
        //curl_setopt($ch, CURLOPT_USERAGENT, 'SSTS Browser/1.0');
        curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'); // 模拟用户使用的浏览器
        //3.抓取URL并把它传递给浏览器
        $res = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if (curl_errno($ch)) {
            return curl_error($ch);
        }
        $info['code'] = $httpCode;
        //4.关闭curl资源，并且释放系统资源
        curl_close($ch);
        if ($returnHeader) {
            // 响应 header 和body 之间两空行
            list($returnHeader, $returnBody) = explode("\r\n\r\n", $res, 2);
            $info['content'] = json_decode($returnBody, true);
        } else {
            $info['content'] = json_decode($res, true);
        }
        return $info;
    }


    /**  api json返回
     * @param array $data
     * @param string $msg
     * @param int $code
     */
    public static function apiResponse($data = array(), $msg = '', $code = 200)
    {
        $response = array(
            'data' => $data ? $data : (object)array(),
            'msg' => $msg ? $msg : '',
            'code' => $code ? $code : ''
        );
        echo json_encode($response, JSON_UNESCAPED_UNICODE);
        exit;
    }
}